import { PokerCard, PokerType } from "../PokerCard.js";

/**
 * 判断数据是否为连续的数字，
 * 比如 [1,2,3,4]，
 * 或者 [1,1,2,2,3,3,4,4]，
 * 或者 [1,1,1,2,2,2,3,3,3]
 * @param nums 数字数组
 * @param time 连续次数
 */
export const isContinuous = (nums: number[], time = 1) => {
  const tmp = [...nums].sort((a, b) => a - b);
  const start = tmp[0];
  return tmp.every((num, index) => num === (start + index / time) >> 0);
};

/**
 * 将手牌从大到小排序后，转为字符串
 * @param cards 手牌
 * @returns
 */
export const cards2letter = (cards: PokerCard[]) => {
  return [...cards]
    .sort((a, b) => b.value - a.value)
    .map((card) => card.letter)
    .join("");
};

/** 手牌 */
export abstract class PokerHand {
  __proto__: any;
  /** 手牌集合 */
  protected cards: PokerCard[] = [];
  /** 本手牌的比较值 */
  public abstract value: number;
  /**
   * 手牌初始化
   * @param cards 手牌的具体内容
   */
  constructor(cards: PokerCard[]) {
    // 进行从大到小的排序
    this.cards = [...cards].sort((a, b) => b.value - a.value);
  }

  /**
   * 是否比目标大
   * @param target 目标手牌
   */
  public abstract isBetter(target: PokerHand): boolean;
  /**
   * 判断是不是本类型的
   * @param cards 手牌
   */
  public abstract isStandard(cards: PokerCard[]): boolean;
}

export default PokerHand;
